import Vue from 'vue'
import axios from 'axios';
import NProgress from 'nprogress'
import 'nprogress/nprogress.css'
/* 进度环隐藏 */
NProgress.configure({showSpinner: false});

let IS_VUE_APP_TOKEN;

/**
 * token 失效 跳回到 login 页
 * @param {String} msg 错误信息 
 */
const errorGoLogin = (msg = "error") => {
    Vue.prototype.$message({
        message: msg,
        type: 'error'
    });
    // setTimeout(() => {
    //     window.open("/login.html", "_top")
    // }, 2000)
}

console.log(process.env.VUE_APP_BASE_URL, 1234567);

const HTTPCode = {
    400: '请求参数错误',
    401: '权限不足, 请重新登录',
    403: '服务器拒绝本次访问',
    404: '请求资源未找到',
    500: '内部服务器错误',
    501: '服务器不支持该请求中使用的方法',
    502: '网关错误',
    504: '网关超时'
}

const request = axios.create({
    baseURL: process.env.VUE_APP_BASE_URL,
    timeout: 30000,
})
/* 请求拦截器 */
request.interceptors.request.use(
    config => {
        try {
            NProgress.start()
            IS_VUE_APP_TOKEN = "5dc5b6239565cfaa71c75efd87575b296c6c4196c4c6a260f73403f20f4f00e4" // JSON.parse(sessionStorage.getItem('userData'))['token']
            IS_VUE_APP_TOKEN && (config.headers.authorization = IS_VUE_APP_TOKEN)
            /* 还可以判断 url 使用不同的情况 */
            // 在这里：可以根据业务需求可以在发送请求之前做些什么:例如我这个是导出文件的接口，因为返回的是二进制流，所以需要设置请求响应类型为blob，就可以在此处设置。
            // if (config.url.includes('pur/contract/export')) {
            //     config.headers['responseType'] = 'blob'
            // }
            // // 我这里是文件上传，发送的是二进制流，所以需要设置请求头的'Content-Type'
            // if (config.url.includes('pur/contract/upload')) {
            //     config.headers['Content-Type'] = 'multipart/form-data'
            // }
        } catch (error) {
            // setTimeout(() => {
            //     window.open("/login.html", "_top")
            // }, 2000)
        }
        return config
    },
    error => {
        return Promise.reject(error)
    }
)
/* 响应拦截 */
request.interceptors.response.use(
    response => {
        NProgress.done()
        if(response.status !== 200) return Promise.reject(response.data)
        return Promise.resolve(response.data)
    },
    error => {
        NProgress.done()
        const errData = error.response;
        console.log(HTTPCode);
        // console.log( error.response.status in HTTPCode, '请求错误是否存在！！！' );
        if (error && errData) {
            switch (error.response.status) {
                case 401: // 未登录
                    console.error('401', error, error.response)
                    errorGoLogin(errData.status+"："+errData.config.url+"，"+errData.data.message)
                    break;
                case 403: // token过期 
                    console.error('403', error, error.response)
                    errorGoLogin(errData.status+"："+errData.config.url+"，"+errData.data.message)
                    break;
                case 404:
                    console.error('404', error, error.response, '?????>>>>>>')
                    errorGoLogin(errData.status+"："+errData.config.url+"，"+errData.data.message)
                    break;

                default:
                    // console.error('default', error, error.response)
                    Vue.prototype.$message({
                        message: errData.status+"："+errData.config.url+"，"+errData.data.message,
                        type: 'error'
                    });
                    break;
            }
        } else {
            Vue.prototype.$message({
                message: 'axios response error underfind',
                type: 'error'
            });
        }
        return Promise.reject(error)
    }
)

export default request